<?php

namespace app\merchant\controller;

use app\merchant\service\Auth;
use app\common\exception\BaseException;
use app\merchant\model\store\User as StoreUserModel;
use org\Redis;


/**
 * 商户后台控制器基类
 * Class BaseController
 * @package app\store\controller
 */
class Base extends \think\Controller
{
    /** @var array $store 商家登录ID */
    protected $store_user_id;

    /** @var string $route 当前控制器名称 */
    protected $controller = '';

    /** @var string $route 当前方法名称 */
    protected $action = '';

    /** @var string $route 当前路由uri */
    protected $routeUri = '';

    /** @var string $route 当前路由：分组名称 */
    protected $group = '';

    /** @var array $accessAllAction 权限验证白名单 */
    protected $accessAllAction = [
        // 图片上传
        'upload/image',
        // 登录页面
        'login/login',
        //验证权限接口
        'index/checkauth',
        // 退出登录
        'login/logout',
        //获取权限树状结构
        'store.role/roleaccess',
        // 获取左边菜单栏
        'store.role/getaccess',
        //获取管理员详情
        'store.user/detail',
        //获取角色详情
        'store.role/detail',
        //添加商品获取商品分类
        'goods/goodscategory',
        //获取商品添加页面所需的数据
        'goods/getgoodsdata',
        //获取商品详情
        'goods/detail',
        //商品分类详情
        'goods.category/detail',
        //首页实时数据概况
        'index/online',
        //首页用户访客数量
        'index/uservisitor',
        //首页交易走势
        'index/echarts',
        //用户详情
        'user/detail',
        //批量发货获取物流公司
        'order.operate/expresslist',
        //门店详情
        'shop/detail',
        //省份列表
        'shop/provincelist',
        //城市和区域列表
        'shop/otherlist',
        //店员管理门店列表
        'shop.clerk/shoplist',
        //店员详情
        'shop.clerk/detail',
        //生成微信支付二维码
        'finance.large/getqrcode',
        //文章管理添加文章获取分类
        'content.article/catgory',
        //文件分组详情
        'content.files.group/detail',
        //秒杀商品详情
        'apps.sharp.goods/detail',
        //添加秒杀商品步骤一
        'apps.sharp.goods/step',
        //新增场次获取活动会场时间
        'apps.sharp.active_time/getactivedata',
        //活动场次详情
        'apps.sharp.active_time/detail',
        //整点秒杀设置
        'apps.sharp.setting/setting',
        //拼团商品分类详情
        'apps.sharing.category/detail',
        //储值卡详情
        'market.card.card/detail',
        //爆品礼详情
        'market.gifts.gifts/detail',
        //优惠券详情
        'market.coupon/detail',

    ];


    /** @var array $allowAllAction 登录验证白名单 */
    protected $allowAllAction = [
        // 登录页面
        'login/login',
        // 退出登录
        'login/logout',
    ];



    /**
     * 后台初始化
     * @throws BaseException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function _initialize()
    {

        // 商家登录ID
        $this->store_user_id = '';
        // 当前路由信息
        $this->getRouteinfo();
        // 验证登录状态
        $this->checkLogin();
        // 验证当前页面权限
        $this->checkPrivilege();

    }

    /**
     * 验证当前页面权限
     * @throws BaseException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function checkHasAuth($controller,$action)
    {
        $routeUri = $controller . '/' . $action;

        // 验证当前请求是否在白名单
        if (in_array($routeUri, $this->accessAllAction)) {
            return true;
        }

        if (!Auth::getInstance()->checkPrivilege($routeUri,$this->store_user_id)) {
            return false;
        }
        return true;
    }


    /**
     * 验证当前页面权限
     * @throws BaseException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    private function checkPrivilege()
    {

        // 验证当前请求是否在白名单
        if (in_array($this->routeUri, $this->accessAllAction)) {
            return true;
        }

        if (!Auth::getInstance()->checkPrivilege($this->routeUri,$this->store_user_id)) {
            $this->throwError('很抱歉，没有访问权限', 0);
        }
        return true;
    }

    /**
     * 验证登录状态
     * @return bool
     */
    private function checkLogin()
    {
        // 验证当前请求是否在白名单
        if (in_array($this->routeUri, $this->allowAllAction)) {
            return true;
        }

        // 记录缓存, 7天
        $redis = new Redis();
        //获取token
        $token = $this->request->param('token')?:-1;

        // 验证登录状态
        $this->store_user_id = $redis->hGet('merchant',$token);

        if(!$this->store_user_id){
            $this->throwError('会话过期，请重新登录', -1);
        }

        $datail = StoreUserModel::detail($this->store_user_id);
        if(!$datail){
            $this->throwError('您的账号存在异常,请联系客服', 0);
        }
        return true;
    }

    /**
     * 解析当前路由参数 （分组名称、控制器名称、方法名）
     */
    protected function getRouteinfo()
    {
        // 控制器名称
        $this->controller = toUnderScore($this->request->controller());

        // 方法名称
        $this->action = $this->request->action();
        // 控制器分组 (用于定义所属模块)
        $groupstr = strstr($this->controller, '.', true);
        $this->group = $groupstr !== false ? $groupstr : $this->controller;
        // 当前uri
        $this->routeUri = $this->controller . '/' . $this->action;

    }




    /**
     * 输出错误信息
     * @param int $code
     * @param $msg
     * @throws BaseException
     */
    protected function throwError($msg, $code = -1)
    {
        throw new BaseException(['code' => $code, 'msg' => $msg]);
    }


    /**
     * 获取当前wxapp_id
     */
    protected function getWxappId()
    {
        $datail = StoreUserModel::detail($this->store_user_id);
        return $datail['wxapp_id'];
    }



    /**
     * 返回封装后的 API 数据到客户端
     * @param int $code
     * @param string $msg
     * @param array $data
     * @return array
     */
    protected function renderJson($code = 1, $msg = '', $data = [])
    {
        return compact('code', 'msg', 'data');
    }

    /**
     * 返回操作成功json
     * @param array $data
     * @param string|array $msg
     * @return array
     */
    protected function renderSuccess($data = [], $msg = '成功')
    {

        return $this->renderJson(1, $msg, $data);
    }

    /**
     * 返回操作失败json
     * @param string $msg
     * @param array $data
     * @return array
     */
    protected function renderError($data = [],$msg = '失败')
    {
        return $this->renderJson(0, $msg, $data);
    }


    /**
     * 获取post数据 (数组)
     * @param $key
     * @return mixed
     */
    protected function postData($key = null)
    {
        return $this->request->post(is_null($key) ? '' : $key . '/a');
    }

    /**
     * 获取post数据 (数组)
     * @param $key
     * @return mixed
     */
    protected function getData($key = null)
    {
        return $this->request->get(is_null($key) ? '' : $key);
    }

}
